from fastapi import APIRouter
from fastapi.exceptions import HTTPException
from pydantic import BaseModel, field_validator
from app.models.models import *

user = APIRouter()


# 登录类型校验
class LoginIn(BaseModel):
    username: str
    password: str


# 登录接口
@user.post("/login", summary="登录")
async def login(user_in: LoginIn):
    """
    用户登录函数。
    
    参数:
    - user_in: LoginIn 类型，包含用户输入的用户名和密码。
    
    返回:
    - 成功登录返回一个包含用户信息的字典，包括用户名和用户ID。
    - 登录失败（用户名或密码错误）抛出一个 HTTPException 异常，状态码为401。
    """
    # 根据用户名和密码查询用户信息，只获取用户的id和username字段
    item = await User.filter(
        username=user_in.username, password=user_in.password
    ).values("id", "username")
    
    # 如果查询结果为空，抛出异常提示用户名或密码错误
    if not item:
        raise HTTPException(
            status_code=401,
            detail={
                "msg": "用户名或密码错误",
                "code": 401,
            },
        )
    
    # 登录成功，返回用户信息
    return {
        "msg": "ok",
        "data": {
            "username": user_in.username,
            "id": item[0]["id"],
        },
        "code": 200,
    }


# 获取用户详细信息
@user.get("/info", summary="获取用户详细信息")
async def get_user_info(user_id: int):
    """
    根据用户ID获取用户详细信息。
    
    参数:
    - user_id (int): 用户的唯一标识符
    
    返回:
    - 用户信息的字典，包括用户名、性别、签名、电话和邮箱。
    """
    # 查询UserInfo表中匹配的用户信息
    user_info = (
        await UserInfo.filter(id=user_id)
        .first()
        .values(
            "username",
            "gender",
            "signature",
            "phone",
            "email",
        )
    )
    # 添加user_id到用户信息中，以便前端获取
    user_info["user_id"] = user_id

    # 如果没有找到用户，抛出HTTP异常
    if not user_info:
        raise HTTPException(
            status_code=404,
            detail={
                "msg": "用户不存在",
                "code": 404,
            },
        )
    # 返回用户信息
    return {
        "msg": "ok",
        "data": {
            "user_info": user_info,
        },
        "code": 200,
    }


# 修改用户个人信息类型校验
class UpdateUserInfoIn(BaseModel):
    user_id: int
    username: str
    gender: str
    phone: str
    signature: str
    email: str

    # 电话号码校验，必须得是11位数字
    @field_validator("phone")
    def phone_must_be_11_digits(cls, value):
        if not value.isdigit() or len(value) != 11:
            raise HTTPException(
                status_code=422,
                detail={
                    "code": 422,
                    "msg": "电话号码必须是11位数字",
                },
            )
        return value


# 修改用户个人信息
@user.put("/info", summary="修改用户个人信息")
async def update_user_info(user_info: UpdateUserInfoIn):
    """
    根据用户ID更新用户信息。

    - **user_info**: 包含要更新的用户信息的模型实例。
    """
    # 先查询用户是否存在
    user_info_obj = await UserInfo.filter(id=user_info.user_id).first()
    if not user_info_obj:
        # 如果用户不存在，抛出HTTP异常
        raise HTTPException(
            status_code=404,
            detail={
                "msg": "用户不存在",
                "code": 404,
            },
        )
    # 更新用户信息
    data = user_info.model_dump()
    data.pop("user_id")
    fin_user_info = await UserInfo.filter(id=user_info.user_id).update(**data)
    print(data)
    # 返回更新后的用户信息
    return {
        "msg": "ok",
        "data": {
            "user_info": fin_user_info,
        },
        "code": 200,
    }
